package dominio.factory

import dominio.datos.Caracteristica
import dominio.datos.Hobbie
import dominio.datos.Rasgo
import dominio.individuos.Sexo
import dominio.individuos.Villano
import dominio.investigacion.Caso
import dominio.investigacion.Expedientes
import dominio.investigacion.Mapamundi
import dominio.ubicaciones.Banco
import dominio.ubicaciones.Biblioteca
import dominio.ubicaciones.Club
import dominio.ubicaciones.Embajada
import dominio.ubicaciones.Lugar
import dominio.ubicaciones.Pais
import java.util.ArrayList
import java.util.List
import utilidades.Utils
import java.util.Collections
import org.eclipse.xtend.lib.annotations.Accessors

@Accessors
class FactoryGame {
	
	Caso caso
	Mapamundi mapamundi
	Expedientes expedientes
	extension Utils utils = new Utils
	
	new() {
		setearExpedientes
		setearCaso
		setearMapamundi
		caso.vincular
		mapamundi.setearConexiones
	}

	def getCaso() {
		this.caso
	}

	def getMapamundi() {
		this.mapamundi
	}

	def getExpedientes() {
		this.expedientes
	}
	
	def getReporte()  
	'''A las 9 de la mañana la comunidad científica fue 
conmovida al darse cuenta del faltante de gran valor! 
El sarcófago del faraón Usermaatra-Meriamón 
Ramsés-Heqaiunu, mejor conocido como Cacho II. 
El criminal fue muy prolijo y la escena del 
crimen no contaba con pista alguna, su misión 
como detective es descifrar el responsable de 
tal crímen y apresarlo.'''

	
	def setearMapamundi() {
		mapamundi = new Mapamundi
		caso.mapamundi = this.mapamundi
		mapamundi.caso = caso
		agregarPais("Egipto", #[new Caracteristica("El pais de las piramides"), new Caracteristica("El pais de las momias")])
		agregarPais("España", #[new Caracteristica("Hacen corridas de toros"), new Caracteristica("El 90% de la poblacion se llama Manolo")])
		agregarPais("Colombia", #[new Caracteristica("Conocidos por el cafe"), new Caracteristica("Falcao nacio en el pais")])
		agregarPais("Brasil", #[new Caracteristica("Se comieron 7"), new Caracteristica("Pais de playas y sungas")])
		agregarPais("Argentina", #[new Caracteristica("Bailan tango"), new Caracteristica("Bandera celeste y blanca")])
		agregarPais("Italia", #[new Caracteristica("Conocidos por sus pizzas y pastas"), new Caracteristica("El pais de la bota")])
		agregarPais("India", #[new Caracteristica("Tienen tres ojos"), new Caracteristica("Donde la vaca es sagrada")])
		agregarPais("EEUU", #[new Caracteristica("No saben jugar fulbito"), new Caracteristica("Adictos al petroleo")])
		agregarPais("Venezuela", #[new Caracteristica("Bandera amarilla, azul y roja"), new Caracteristica("El pais de la vino-tinto")])
		agregarPais("Sudafrica", #[new Caracteristica("Hogar de la cultura Zulú"), new Caracteristica("Las tierras de Mandela")])
		agregarPais("Bahamas", #[new Caracteristica("Situado en el caribe"), new Caracteristica("Esta lleno de bancos para empresas fantasma")])
		agregarPais("Francia", #[new Caracteristica("Comen baguette"), new Caracteristica("El pais de la torre Eiffel")])
		agregarPais("Uruguay", #[new Caracteristica("Hogar del candombe"), new Caracteristica("Apodados charruas")])
		agregarPais("Costa Rica", #[new Caracteristica("Revelacion de Brasil 2014"), new Caracteristica("Apodados ticos")])
		agregarPais("Inglaterra", #[new Caracteristica("Sede del torneo de Wimbledon"), new Caracteristica("Su moneda es la Libra Esterlina")])
		agregarPais("Canada", #[new Caracteristica("Bandera roja y blanca con una hoja de arbol"), new Caracteristica("Su capital es Ottawa")])
		agregarPais("Israel", #[new Caracteristica("Sus habitantes hablan hebreo"), new Caracteristica("Conocido por el muro de los lamentos")])
		agregarPais("Cuba", #[new Caracteristica("Ubicado en una isla del caribe"), new Caracteristica("Conocidos por sus habanos")])
		agregarPais("China", #[new Caracteristica("Practican el budismo"), new Caracteristica("El pais de la tecnologia")])
		agregarPais("Mexico", #[new Caracteristica("El pais de los mariachis"), new Caracteristica("Hogar del Chavon del Ocho")])
		agregarPais("Rusia", #[new Caracteristica("Toman vodka como agua"), new Caracteristica("El 90% de la población se llama Vladimir o Dimitri")])
	}
	
	/* Crea conexiones randomicas entre los paises del mapamundi */
	def setearConexiones(Mapamundi mapamundi) {
		mapamundi.paises.forEach[p | 
			p.setearConexionesRandom((Math.random*2).intValue + 1)
		]
	}
	
	/* Crea una cantidad parametrica de conexiones para un pais en especial */
	def setearConexionesRandom(Pais pais, Integer cantidad) {
		do {
			val randomIndex = mapamundi.paises.calculeRandomIndex
			val	conexion = mapamundi.paises.get(randomIndex)
			if(pais.puedeConectar(conexion))
				pais.agregarConexion(conexion)	
		}
		while (pais.conexiones.size <= cantidad)
		Collections.shuffle(pais.nombresConexiones) //Mescla los paises
	}
	
	def puedeConectar(Pais pais1, Pais pais2) {
		!pais1.conexiones.contains(pais2) &&
		pais1 != pais2
	}

	def setearExpedientes() {
		expedientes = new Expedientes => [
			villanos += new Villano => [
				nombre = "Rufo Taytoom"
				sexo = Sexo.Masculino
				rasgos += new Rasgo("Parche en el ojo")
				rasgos += new Rasgo("Barba candado")
				hobbies += new Hobbie("Maneja moto")
				hobbies += new Hobbie("Juega al rugby")
			]
			
			villanos += new Villano => [
				nombre = "Carmen Sandiego"
				sexo = Sexo.Femenino
				rasgos += new Rasgo("Pelo castaño")
				rasgos += new Rasgo("Usa sombrero rojo")
				hobbies += new Hobbie("Juega al croquet")
			]	 
			
			villanos += new Villano => [
				nombre = "Al Capone"
				sexo = Sexo.Masculino
				rasgos += new Rasgo("Pelo castaño")
				rasgos += new Rasgo("Usa sombrero negro")
				hobbies += new Hobbie("Come espaguetis")
			]	 
			
			villanos += new Villano => [
				nombre = "El Gordo Valor"
				sexo = Sexo.Masculino
				rasgos += new Rasgo("Es gordo")
				rasgos += new Rasgo("Argentino")
				hobbies += new Hobbie("Roba bancos")
			]	 

			villanos += new Villano => [
				nombre = "Gaston Aguirre"
				sexo = Sexo.Masculino
				rasgos += new Rasgo("Pelo castaño")
				rasgos += new Rasgo("Argentino")
				hobbies += new Hobbie("Motochorro")
				hobbies += new Hobbie("Fetiche por las mochilas")
			]	 

			villanos += new Villano => [
				nombre = "Bob Patiño"
				sexo = Sexo.Masculino
				rasgos += new Rasgo("Pelo colorado")
				rasgos += new Rasgo("Patas largas")
				hobbies += new Hobbie("Matar a Bart")
			]	 

			villanos += new Villano => [
				nombre = "Yiya Murano"
				sexo = Sexo.Femenino
				rasgos += new Rasgo("Pelo rubio")
				rasgos += new Rasgo("Usa lentes")
				hobbies += new Hobbie("Le gusta envenenar gente")
			]	 

			villanos += new Villano => [
				nombre = "Roberta Villana"
				sexo = Sexo.Femenino
				rasgos += new Rasgo("Pelo colorado")
				rasgos += new Rasgo("Usa lentes")
				hobbies += new Hobbie("Roba bancos")
			]	 

			villanos += new Villano => [
				nombre = "Tony el Gordo"
				sexo = Sexo.Masculino
				rasgos += new Rasgo("Es Gordo")
				rasgos += new Rasgo("Italiano")
				hobbies += new Hobbie("Maneja un Bentley")
			]	 
		]
	}
	
	def setearCaso() {
		caso = new Caso("Robo del Faraón", reporte.toString, "Sarcofago de Cacho II", mapamundi, expedientes)
	}
	
	def lugaresPosibles(Pais pais) {
		new ArrayList<Lugar> => [
			add(new Embajada(pais))
			add(new Banco(pais))
			add(new Biblioteca(pais))
			add(new Club(pais))
		]
	}
	
	def asignarLugares(Pais pais) {
		val posibles = lugaresPosibles(pais)
		while(posibles.size != 1) {
			var randomLugar = takeRandom(posibles, 1)
			pais.lugares.addAll(randomLugar)
			posibles.removeAll(randomLugar)
		} 
	}
	
	def agregarPais(String nombre) {
		mapamundi.agregarPais(
			mapamundi.nuevoPais => [
				it.nombre = nombre 
				asignarLugares
			]
		)
	}
	
	def agregarPais(String nombre, List<Caracteristica> cs) {
		val pais = mapamundi.nuevoPais
		pais.nombre = nombre
		pais.caracteristicas += cs
		pais.asignarLugares
		mapamundi.agregarPais(pais) 
	}
	
}